<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    
  </style>
</head>
<body>
  <ul>
    <li>link1</li>
    <li>link2</li>
    <li>link3</li>
  </ul>
</body>
<script>


  // const obj = new Object();
  // const arr = new Array();
  // const lis = new NodeList();
  // const date = new Date();
  // const reg = new RegExp();

  // 隐式原型：__proto__，对象类型，指向了当前所属数据的构造函数的显示原型
  // 任何对象数据都具备隐式原型
  // 隐式原型在使用过程中可以省略
  // console.log( obj );
  // console.log( arr );
  // console.log( lis );
  // console.log( date );
  // console.log( reg );

  // 显式原型：prototype，对象类型，用来被自身所属的函数创建出的实例的隐式原型指向
  // 任何函数数据都具备隐式原型（箭头函数除外）
  // prototype：表示了所属的函数创建出的实例的公共方法库

  // function fn(){}

  // console.log(fn.prototype);

  // fn.prototype.show = function(){ "show" }

  // const a1 = new fn();
  // const a2 = new fn();

  // console.log(a1.__proto__ === fn.prototype);
  // console.log(a2.__proto__ === fn.prototype);

  // console.log(a1.__proto__.show);
  // console.log(a2.__proto__.show);

  // console.log( a1.__proto__.show === fn.prototype.show );
  // console.log( a2.__proto__.show === fn.prototype.show );

  // console.log(a1.show);
  // console.log(a2.show);

  // console.log(a1.show === fn.prototype.show);
  // console.log(a2.show === fn.prototype.show);

  // console.log(a2.show === a2.show);

  // console.log( a1 );
  // console.log( a2 );



  // 原型链：因为任何对象数据都有隐式原型，隐式原型的数据类型是对象，所以隐式原型也具备自己的隐式原型...

  // 原型链的顶层：Object.prototype

  // Object.prototype.qianfeng_liyang = function(){
  //   console.log("千锋李扬")
  // }
  // const obj = {}
  // obj.qianfeng_liyang();

  // const arr = [];
  // arr.qianfeng_liyang();

  // const str = new String("hahahaha");
  // str.qianfeng_liyang();

  // const d = new Date();
  // d.qianfeng_liyang();

  // const reg = /a/;
  // reg.qianfeng_liyang();

  // const s = new Set();
  // s.qianfeng_liyang();

  // document.body.qianfeng_liyang();
  
  // =======

  // 原型链的访问规则：先在自身对象查找，找到了就使用，没找到，自动沿着__protyo__依次向上层查找，任意一层找到了，都直接使用，并停止。直到Object.prototype还没找到，抛出undefined

  // 就近原则


  function CreateObj(name,age){
    this.name = name
    this.age = age
    // this.show = function(){
    //   console.log("实例私有show")
    // }
  }

  // CreateObj.prototype.show = function(){
  //   console.log(this.name)
  // }

  const o1 = new CreateObj("admin", 18)
  const o2 = new CreateObj("root", 20)

  console.log(o1)
  console.log(o2)

  console.log(o1.show)

  o1.show();
  o2.show();

  console.log(o1.show === o2.show)











  // 伪数组：有索引，有length，但不能使用数组的其他方法
  // 伪数组：隐式原型不指向Array


  
</script>
</html>